package com.shujia.mysql;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo3LargeDataIntoMySQL {
    public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
        // 加载驱动
        Class.forName("com.mysql.jdbc.Driver");

        // 创建连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/db1?useSSL=false", "root", "123456");

        Statement st = conn.createStatement();
        st.execute("CREATE TABLE if not exists `student_large` (\n" +
                "  `id` int(10) NOT NULL COMMENT '学生id',\n" +
                "  `name` varchar(10) DEFAULT NULL COMMENT '学生姓名',\n" +
                "  `age` int(2) DEFAULT NULL COMMENT '学生年龄',\n" +
                "  `gender` varchar(1) DEFAULT NULL COMMENT '学生性别',\n" +
                "  `clazz` varchar(5) DEFAULT NULL COMMENT '学生班级'\n" +
                ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生信息表';");


        // 配置
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://master:3306/db1");
        config.setUsername("root");
        config.setPassword("123456");
        config.addDataSourceProperty("connectionTimeout", "1000"); // 连接超时：1秒
        config.addDataSourceProperty("idleTimeout", "60000"); // 空闲超时：60秒
        config.addDataSourceProperty("maximumPoolSize", "8"); // 最大连接数：16
        config.addDataSourceProperty("useSSL", "false"); // 关闭使用SSL连接

        // 创建连接池实例
        DataSource ds = new HikariDataSource(config);

        // 创建线程池
        ExecutorService es = Executors.newFixedThreadPool(8);

        ArrayList<String[]> linesSplit = new ArrayList<String[]>();

        // 读取数据
        BufferedReader br = new BufferedReader(new FileReader("data/students.txt"));
        String line;
        // 将数据读取进来，切分后放入ArrayList中，避免多次读取文件
        while ((line = br.readLine()) != null) {
            String[] splits = line.split(",");
            linesSplit.add(splits);
        }


        for (int i = 0; i < 100; i++) {

            // 从连接池中获取连接
            Connection con = ds.getConnection();

            InsertTask insertTask = new InsertTask(linesSplit, con, i);

            // 以多线程的方式提交任务
            es.submit(insertTask);

            System.out.println("第" + i + "个任务已提交");

        }


        // 关闭连接
        st.close();
        conn.close();

        es.shutdown();


    }
}
